package com.zijidelu.luframework.infrastructure.factory;

import com.zijidelu.luframework.base.model.DataModel;
import com.zijidelu.luframework.base.model.PO;
import com.zijidelu.luframework.infrastructure.persistence.repository.core.bizsig.BizSigRepository;
import com.zijidelu.luframework.infrastructure.persistence.repository.core.data.DataRepository;

/**
 * @author ZIJIDELU
 * @datetime 2025/11/19 21:01
 */
public interface DataVault {

    // === 注册 API ===

    /**
     * 注册数据模型与数据仓库的映射关系
     * <p>
     * 此方法通常在应用启动时由扫描器调用
     *
     * @param dataModelClass 数据模型类型
     * @param repository     数据仓库实例
     */
    <P extends PO, D extends DataModel> void registerDataRepository(Class<D> dataModelClass,
                                                                    DataRepository<P, D> repository);

    /**
     * 注册数据模型与业务签名仓库的映射关系
     * <p>
     * 此方法通常在应用启动时由扫描器调用
     *
     * @param dataModelClass 数据模型类型
     * @param repository     业务签名仓库实例
     */
    <P extends PO, D extends DataModel> void registerBizSigRepository(Class<D> dataModelClass,
                                                                      BizSigRepository<P, D> repository);

    /**
     * 获取指定数据模型对应的数据仓库
     *
     * @param dataModelClass 数据模型类型
     * @return 对应的数据仓库，未找到返回 null
     */
    <P extends PO, D extends DataModel> DataRepository<P, D> getDataRepository(Class<D> dataModelClass);

    /**
     * 通过对象类型直接获取对应的数据仓库
     * <p>
     * 这是一个便捷方法，会自动先查找 DataModel，再查找对应的 Repository
     *
     * @param sourceClass 源对象类型
     * @return 对应的数据仓库，未找到返回 null
     */
    <P extends PO, D extends DataModel> DataRepository<P, D> getDataRepositoryFor(Class<?> sourceClass);

    /**
     * 获取指定数据模型对应的数据仓库
     *
     * @param dataModelClass 数据模型类型
     * @return 对应的数据仓库，未找到返回 null
     */
    <P extends PO, D extends DataModel> BizSigRepository<P, D> getBizSigRepository(Class<D> dataModelClass);
}
